package com.rgc.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.rgc.domain.Evento;
import com.rgc.domain.EventoJuego;
import com.rgc.domain.Publicacion;
import com.rgc.domain.Usuario;

public class EventoDaoImpl extends JdbcDaoSupport implements EventoDao {

	public boolean addEvento(final Evento evento) {
		
		try {
			KeyHolder keyHolder = new GeneratedKeyHolder(); 
			final String sql = "INSERT INTO evento(idagrupacion,idcomuna,nombre,direccion,fecha_evento) values(?,?,?,?,?)";
			getJdbcTemplate().update(
					new PreparedStatementCreator()
			        {
			            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
			            {
			                PreparedStatement preparedStatement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			                preparedStatement.setString(1,evento.getIdagrupacion());
			                preparedStatement.setString(2,evento.getIdcomuna());
			                preparedStatement.setString(3,evento.getNombre());
			                preparedStatement.setString(4,evento.getDireccion());
			                preparedStatement.setString(5,evento.getFecha_evento());
			  
	
			                return preparedStatement;
			            }
			        }	,keyHolder);			
		    	final int idevento = keyHolder.getKey().intValue();
		    	
		    	final String sql_pub = "INSERT INTO publicacion(idusuario,idpublicacion_tipo,cuerpo,titulo,urlimagen,idevento) values(?,?,?,?,?,?)";
				getJdbcTemplate().update(
						new PreparedStatementCreator()
				        {
				            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
				            {
				                PreparedStatement preparedStatement = conn.prepareStatement(sql_pub, Statement.RETURN_GENERATED_KEYS);
				                preparedStatement.setString(1,evento.getPublicacion().getIdusuario());
				                preparedStatement.setString(2,"2");
				                preparedStatement.setString(3,evento.getPublicacion().getCuerpo());
				                preparedStatement.setString(4,evento.getPublicacion().getTitulo());
				                preparedStatement.setString(5,evento.getPublicacion().getUrlimagen());
				                preparedStatement.setInt(6,idevento);
				                

				  
		
				                return preparedStatement;
				            }
				        }	);			
			    	
		    	
			    	for(final EventoJuego eventojuego : evento.getJuegos()){
			    		
			    		final String sql_juego = "INSERT INTO evento_juego(idevento,idregla,idpuntaje,idplataforma,cupos,modalidad,idjuego)"
			    							   + " values(?,?,?,?,?,?,?)";
						getJdbcTemplate().update(
								new PreparedStatementCreator()
						        {
						            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
						            {
						                PreparedStatement preparedStatement = conn.prepareStatement(sql_juego, Statement.RETURN_GENERATED_KEYS);
						                preparedStatement.setInt(1,idevento);
						                preparedStatement.setString(2,eventojuego.getIdregla());
						                preparedStatement.setString(3,eventojuego.getIdpuntaje());
						                preparedStatement.setString(4,eventojuego.getIdplataforma());
						                preparedStatement.setString(5,eventojuego.getCupos());
						                preparedStatement.setString(6,eventojuego.getModalidad());
						                preparedStatement.setString(7,eventojuego.getIdjuego());
						                return preparedStatement;
						            }
						        });			
					    	
			    		
			    	}
		    	
		    	
               
              return true;
         
        } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
        }
		return false;
	}

	public Evento getEvento(String idevento) {
		List<Evento> evento= listEvento(new String[]{"idevento"},new String[]{idevento},null,null,null);
		if(evento.size()>0)
			return evento.get(0);
		return null;
	}

	public List<Evento> listEvento() {
		return listEvento(new String[]{},new String[]{},null,null,"10");
	}
	
	public List<Evento> listEvento(String busqueda) {
		return listEvento(new String[]{"nombre"},new String[]{busqueda},new String[]{"LIKE"},null,"10");
	}

	
	
	public List<Evento> listEvento(String[] campo, String[] valor,String[] signo,String[] conectorEntrada,String limite) {
		
		
		try {
			if(limite!=null)
				limite=" LIMIT 0,"+limite+" ";
			else
				limite="";
			
			
			
			
			String sql = " SELECT * from evento  ";
			String conector=" where ";
			for (int i=0;i<campo.length;i++)  {
				 String signo1=" ='";
				 String signo2="' ";
				 if(signo!=null){
					 if(signo[i].equals("LIKE")){
						 signo1=" LIKE '%";
						 signo2="%' ";
					 }
				 }
				 System.out.println("[["+i+"]]");
				 sql+=conector+""+campo[i]+signo1+valor[i]+signo2;
				 if(conectorEntrada==null)
					 conector=" and ";
				 else
					 conector=" "+conectorEntrada[i]+" ";
				
						 
		    }
			sql+=conector+"  estado>0  "+" order by idevento desc "+limite;
			System.out.println(sql);
			List<Evento> publicacionFound =  getJdbcTemplate().query(
        			sql, new BeanPropertyRowMapper<Evento>(Evento.class));
         
        	return publicacionFound;
        	
    } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
    }
	return new ArrayList<Evento>();	
		
	}

	public List<Evento> listEventoStaff(String idstaff) {
		return listEvento(new String[]{"idagrupacion"},new String[]{idstaff},null,null,"10");
	}

	public boolean cierraEvento(String idevento) {
		try {
			String sql = "UPDATE evento set estado=3 where idevento='"+idevento+"' ";
	         getJdbcTemplate().update(sql);
	         
	        return true;
		}catch(Exception e){
			e.printStackTrace();

		}

		return false;
	}

	public List<Evento> misEventos(Usuario usuario) {
		
		try{
			
			
			String sql=" select a.* from evento a,evento_juego b,participante c "
					  +" where c.idevento_juego=b.idevento_juego and b.idevento=a.idevento "
					  +" and c.idusuario='"+usuario.getIdusuario()+"' "
					  +" group by idevento "
					  +" order by fecha desc ";
			
			System.out.println(sql);
			List<Evento> publicacionFound =  getJdbcTemplate().query(
        			sql, new BeanPropertyRowMapper<Evento>(Evento.class));
			
			return publicacionFound;
			
		}catch(Exception e){e.printStackTrace();}
		
		return new ArrayList<Evento>();


	}

	public boolean cancelaEvento(Evento evento) {
		try {
			String sql = "DELETE FROM evento  where idevento='"+evento.getIdevento()+"' ";
	        getJdbcTemplate().update(sql);
	        
	        sql = "DELETE FROM evento_juego  where idevento='"+evento.getIdevento()+"' ";
	        getJdbcTemplate().update(sql);
	        
	        sql = "DELETE FROM publicacion  where idevento='"+evento.getIdevento()+"' ";
	        getJdbcTemplate().update(sql);
	         
	        return true;
		}catch(Exception e){
			e.printStackTrace();

		}

		return false;
		
	}
	
	
}
